#include "comm/znx_log.h"

static znx_log_t    new_log;

const char *str = "[2022/09/14 17:54:01] [debug] [znx_log_test.c:61] aaaaaaa\n";
void *write_log(void *args)
{
    int fd = (int)(intptr_t)args;
    size_t str_len = strlen(str);

    while (1) {
        write(fd, str, str_len);
    }

    return NULL;
}

void test_write_log()
{
    int                     i;
    znx_result_t            res;
    int                     fd;

    res = znx_syscall_open("/tmp/err.log", O_CREAT|O_APPEND|O_WRONLY, 0644);
    assert(res >= 0);

    fd = (int)res;

    for (i = 0; i < 16; i++) {
        znx_thread_create(write_log, (void *)(intptr_t)fd, ZNX_TRUE);
    }
}


void *async_output(void *args)
{
    znx_log_t *log = (znx_log_t *)args;
    char *str = "aaaaaaa";

    while(1) {
        ZNX_LOG_DEBUG(log, NULL, "%s-%s-%s-%d-%s", str, str, str, 1, str);
    }

    return NULL;
}

void test_znx_log_async_output()
{
    int         i;

    bzero(&new_log, sizeof(znx_log_t));
    znx_log_init(&new_log, 0, LOG_LEVEL_DEBUG, "/tmp/err2.log", LOG_ROLLING_DAY);

    for (i = 0; i < 16; i++) {
        znx_thread_create(async_output, &new_log, ZNX_TRUE);
    }
}

void test_log_flush()
{
    znx_log_t new_log;
    bzero(&new_log, sizeof(znx_log_t));

    znx_log_init(&new_log, 0, LOG_LEVEL_DEBUG, "/tmp/error.log", LOG_ROLLING_DAY);
    ZNX_LOG_DEBUG(&new_log, NULL, "33333333");
    ZNX_LOG_WARN(&new_log, NULL, "33333333");
    ZNX_LOG_ERROR(&new_log, NULL, "33333333");
    sleep(6);
    ZNX_LOG_DEBUG(&new_log, NULL, "44444444");
    ZNX_LOG_WARN(&new_log, NULL, "44444444");
    ZNX_LOG_ERROR(&new_log, NULL, "44444444");
    sleep(6);
    ZNX_LOG_DEBUG(&new_log, NULL, "55555555");
    ZNX_LOG_WARN(&new_log, NULL, "55555555");
    ZNX_LOG_ERROR(&new_log, NULL, "55555555");
    sleep(6);
    ZNX_LOG_DEBUG(&new_log, NULL, "666666666");
    ZNX_LOG_WARN(&new_log, NULL, "666666666");
    ZNX_LOG_ERROR(&new_log, NULL, "666666666");
    znx_log_flush(&new_log);
    ZNX_LOG_DEBUG(&new_log, NULL, "777777777");
    ZNX_LOG_WARN(&new_log, NULL, "777777777");
    ZNX_LOG_ERROR(&new_log, NULL, "777777777");
    znx_log_flush(&new_log);
    sleep(6);
    ZNX_LOG_DEBUG(&new_log, NULL, "8888888");
    ZNX_LOG_WARN(&new_log, NULL, "8888888");
    ZNX_LOG_ERROR(&new_log, NULL, "8888888");

    znx_log_stop(&new_log);
}

void test_log_rolling()
{
    znx_log_t new_log;
    bzero(&new_log, sizeof(znx_log_t));
    znx_log_init(&new_log, 0, LOG_LEVEL_DEBUG, "/tmp/error.log", LOG_ROLLING_MINUTE);

    ZNX_LOG_DEBUG(&new_log, NULL, "66666666");
    ZNX_LOG_WARN(&new_log, NULL, "66666666");
    ZNX_LOG_ERROR(&new_log, NULL, "66666666");
    sleep(65);
    ZNX_LOG_DEBUG(&new_log, NULL, "7777777");
    ZNX_LOG_WARN(&new_log, NULL, "7777777");
    ZNX_LOG_ERROR(&new_log, NULL, "7777777");
    sleep(65);
    ZNX_LOG_DEBUG(&new_log, NULL, "8888888");
    ZNX_LOG_WARN(&new_log, NULL, "8888888");
    ZNX_LOG_ERROR(&new_log, NULL, "8888888");
    znx_log_stop(&new_log);
}


int main()
{
    ZNX_DEF_LOG_DEBUG(NULL, "11111111");
    ZNX_DEF_LOG_WARN(NULL, "11111111");
    ZNX_DEF_LOG_ERROR(NULL, "11111111");
    znx_def_log_stop();
    // ZNX_DEF_LOG_FATAL("fatal test");

    znx_def_log_init(0, LOG_LEVEL_DEBUG, NULL, LOG_ROLLING_MINUTE);
    ZNX_DEF_LOG_DEBUG(NULL, "22222222");
    ZNX_DEF_LOG_WARN(NULL, "22222222");
    ZNX_DEF_LOG_ERROR(NULL, "22222222");

    znx_str_t str = ZNX_STRING("123456");
    ZNX_DEF_LOG_ERROR(NULL, "%V", &str);

    znx_def_log_stop();

    // test_log_flush();
    // test_log_rolling();

    // 27W/s
    // test_write_log();
    // up to 330W/s in release mode
    // test_znx_log_async_output();

    // sleep(20);

    return 0;
}